package com.zhoug.player.vlcplayer;

import android.graphics.Bitmap;
import android.view.TextureView;

import com.zhoug.player.core.CapturePictureListener;
import com.zhoug.player.core.PlayError;
import com.zhoug.player.core.PlayProgressListener;
import com.zhoug.player.core.VideoRecordListener;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import androidx.annotation.IntDef;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;

/**
 * 播放器接口定义
 *
 * @author: zhoug
 * @since: 2025-08-11
 */
public interface IPlayer2 {
    /**
     * 播放状态
     */
    @Documented
    @Retention(RetentionPolicy.SOURCE)
    @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE})
    @IntDef({IDLE, PLAYING, PAUSED, STOPPED, BUFFERING, ENDED})
    @interface State {
    }


    /**
     * 初始状态
     */
    int IDLE = 0;
    /**
     * 播放中
     */
    int PLAYING = 2;
    /**
     * 缓冲（播放中卡顿）
     */
    int BUFFERING = 3;
    /**
     * 暂停播放
     */
    int PAUSED = 4;
    /**
     * 停止
     */
    int STOPPED = 5;

    /**
     * 结束
     */
    int ENDED = 6;


    /**
     * 设置显示页面
     *
     * @param textureView TextureView
     */
    @MainThread
    void setVideoTextureView(@Nullable TextureView textureView);

    /**
     * 设置播放url
     *
     * @param url
     */
    void setPlayUrl(@Nullable String url);

    /**
     * 预加载资源
     */
    void prepare();

    /**
     * 开始播放
     */
    void play();

    /**
     * 暂停播放
     */
    void pause();

    /**
     * 停止播放
     */
    void stop();

    /**
     * 释放播放器资源
     */
    void release();

    /**
     * 是否正在播放
     *
     * @return 是否正在播放
     */
    boolean isPlaying();


    /**
     * 当前播放器状态
     *
     * @return {@link State}
     */
    int getState();

    /**
     * 当前播放位置 单位毫秒
     *
     * @return 当前播放位置
     */
    long getCurrentPosition();

    /**
     * 总时长 单位毫秒
     *
     * @return 总时长
     */
    long getDuration();

    /**
     * 是否支持seekTo
     *
     * @return true:支持
     */
    boolean isSeekable();

    /**
     * 定位到指定时间播放
     *
     * @param time 时间单位毫秒
     */
    void seekTo(long time);

    /**
     * 设置静音
     *
     * @param mute true:静音,false:非静音
     */
    void setMute(boolean mute);

    /**
     * 是否是静音
     *
     * @return 是否是静音
     */
    boolean isMute();

    /**
     * 截屏
     *
     * @return Bitmap
     */
    Bitmap captureBitmap();

    /**
     * 截屏
     *
     * @param path 截屏成功后保存的路径
     */
    void capturePictureToFile(@NonNull String path);


    /**
     * 开始录制当前视频
     *
     * @param path 保存的视频地址
     */
    void startRecordVideo(String path);

    /**
     * 停止录制视频
     */
    void stopRecordVideo();

    /**
     * 是否正在录像
     *
     * @return 是否正在录像
     */
    boolean isRecording();

    /**
     * 播放监听
     *
     * @param playListener {@link Listener}
     */
    void setPlayListener(@Nullable Listener playListener);

    /**
     * 设置截屏回掉
     *
     * @param capturePictureListener {@link CapturePictureListener}
     */
    void setCapturePictureListener(@Nullable CapturePictureListener capturePictureListener);

    /**
     * 设置视频录制回掉
     *
     * @param videoRecordListener {@link VideoRecordListener}
     */
    void setVideoRecordListener(@Nullable VideoRecordListener videoRecordListener);

    /**
     * 视频播放进度监听
     *
     * @param playProgressListener {@link PlayProgressListener}
     */
    void setPlayProgressListener(@Nullable PlayProgressListener playProgressListener);


    /**
     * 播放监听器
     */
    interface Listener {

        /**
         * 播放状态改变
         *
         * @param state
         */
        void onPlayStatusChange(@IPlayer2.State int state);

        /**
         * 播放发生错误
         *
         * @param code  自定义的错误状态{@link PlayError}
         * @param error
         */
        void onPlayError(@PlayError.ErrorCode int code, String error);

        /**
         * 视频宽高改变回掉
         *
         * @param width  视频宽
         * @param height 视频高
         */
        void onVideoSizeChanged(int width, int height);

    }


}
